﻿#include "Stack.h"

// 栈-工具函数
// 容量检测 - 扩容
void CheckCapacity(Stack* stk)
{
	assert(stk);
	if (stk->_top == stk->_capacity)
	{
		stk->_capacity *= 2;
		stk->_a = (DataType*)realloc(stk->_a ,sizeof(DataType) * stk->_capacity);
		if (stk->_a == NULL)
		{
			printf("realloc error\n");
			exit(-1);
		}
	}
}

// 栈-基本操作函数
// 初始化栈
void StackInit(Stack* stk)
{
	assert(stk);
	stk->_top = 0;
	stk->_capacity = 2;
	stk->_a = (DataType*)malloc(sizeof(DataType) * stk->_capacity);
	if (stk->_a == NULL)
	{
		printf("malloc error\n");
		exit(-1);
	}
}
// 入栈
void StackPush(Stack* stk, DataType data)
{
	assert(stk);
	CheckCapacity(stk);
	stk->_a[stk->_top++] = data;
}
// 出栈
DataType StackPop(Stack* stk)
{
	assert(stk);
	CheckCapacity(stk);
	stk->_top--;
	return stk->_a[stk->_top];
}
// 获取栈顶元素
DataType StackTop(Stack* stk)
{
	assert(stk);
	assert(stk->_top != 0);
	return stk->_a[stk->_top - 1];
}
// 获取栈中有效元素个数
size_t StackSize(Stack* stk)
{
	assert(stk);
	return stk->_top;
}
// 栈是否为空 不空返回0 为空返回非0
int StackEmpty(Stack* stk)
{
	assert(stk);
	return stk->_top == 0;
}
// 销毁栈
void StackDestory(Stack* stk)
{
	assert(stk);
	free(stk->_a);
	stk->_capacity = stk->_top = 0;
}